package com.itheima.aspect;

import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

/**
 * 切面类1
 *
 * @author liudo
 * @version 1.0
 * @project tlias-backend
 * @date 2023/9/13 11:06:05
 */
@Aspect
// @Component
@Slf4j
public class Aspect1 {
    /**
     * 切入点表达式 AOP的生效范围
     *  * 代表单个词  .. 代表任意
     */
    // @Pointcut("execution(* com.itheima.service.*.*(..))")
    // @Pointcut("execution(* com..removeById(..)) throws Exception")
    // 要求同学们写一个Mapper层中 所有的删除方法(?) 的AOP增强 deleteXxxx
    // 要求同学们写一个Mapper层中 所有的删除方法(?) 更新的 的AOP增强 deleteXxxx 或或者和
    // execution 表达对方法的命名要求比较高
    // @annotation 表达式 - 基于注解的
    // @Pointcut("execution(* com.itheima.mapper.*.delete*(..)) || " +
    //         "execution(* com.itheima.mapper.*.update*(..))")

    @Pointcut("@annotation(com.itheima.annotation.DeleteOrUpdate)")
    public void pt() {

    }

    @Around("pt()") // 对所有的Service方法进行增强
    public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
        // 获取目标对象
        Object target = joinPoint.getTarget();
        // 获取方法签名
        Signature signature = joinPoint.getSignature();
        // 获取参数信息
        Object[] args = joinPoint.getArgs();
        log.info("------------1around 前 通知-------------");
        // 执行Service方法
        Object o = joinPoint.proceed();
        // 打印执行时间
        log.info("------------5around 后 通知-------------");
        return o;

    }
    // @Before("pt()")
    // public void before(JoinPoint joinPoint) {
    //     log.info("------------2before通知-------------");
    // }
    // @After("pt()")
    // public void after(JoinPoint joinPoint) {
    //     log.info("------------4after通知-------------");
    // }
    // @AfterReturning("pt()")
    // public void afterReturning(JoinPoint joinPoint) {
    //     log.info("------------3AfterReturning通知-------------");
    // }
    // @AfterThrowing("pt()")
    // public void afterThrowing(JoinPoint joinPoint) {
    //     log.info("------------AfterThrowing通知-------------");
    // }
}
